skytraq: prepare for upcoming gps week-rollover
authorMathias Adam <m.adam-github@adamis.de>
Sat, 19 Jan 2019 12:48:46 +0000 (13:48 +0100)
committerMathias Adam <mathias@alpha.inft.de>
Mon, 4 Feb 2019 11:02:31 +0000 (12:02 +0100)
skytraq.cc
testo.d/skytraq.test

index 59c7eef24f50753f1849e6c46a7aeef109e3dd3a..ffa5b5459f5c8c024c3c91af1ec7c665b6603d55 100644 (file)
@@ -2,7 +2,7 @@
 
     Serial download of track data from GPS loggers with Skytraq chipset.
 
-    Copyright (C) 2008-2012  Mathias Adam, m.adam (at) adamis.de
+    Copyright (C) 2008-2019  Mathias Adam, m.adam (at) adamis.de
 
     2008         J.C Haessig, jean-christophe.haessig (at) dianosis.org
     2009-09-06 | Josef Reisinger | Added "set target location", i.e. -i skytrag,targetlocation=<lat>:<lng>
@@ -70,6 +70,7 @@ static char* opt_no_output = nullptr;         /* disable output? (0/1) */
 static char* opt_set_location = nullptr;       /* set if the "targetlocation" options was used */
 static char* opt_configure_logging = nullptr;
 static char* opt_gps_utc_offset = nullptr;
+static char* opt_gps_week_rollover = nullptr;
 
 static
 arglist_t skytraq_args[] = {
@@ -117,6 +118,10 @@ arglist_t skytraq_args[] = {
     "gps_utc_offset", &opt_gps_utc_offset, "Seconds that GPS time tracks UTC (0: best guess)",
     "0", ARGTYPE_INT, ARG_NOMINMAX, nullptr
   },
+  {
+    "gps-week-rollover", &opt_gps_week_rollover, "GPS week rollover period we're in (<0: best guess)",
+    "-1", ARGTYPE_INT, ARG_NOMINMAX, nullptr
+  },
   ARG_TERMINATOR,
 };
 
@@ -134,6 +139,10 @@ arglist_t skytraq_fargs[] = {
     "gps_utc_offset", &opt_gps_utc_offset, "Seconds that GPS time tracks UTC (0: best guess)",
     "0", ARGTYPE_INT, ARG_NOMINMAX, nullptr
   },
+  {
+    "gps-week-rollover", &opt_gps_week_rollover, "GPS week rollover period we're in (<0: best guess)",
+    "-1", ARGTYPE_INT, ARG_NOMINMAX, nullptr
+  },
   ARG_TERMINATOR
 };
 
@@ -580,12 +589,12 @@ static time_t
 gpstime_to_timet(int week, int sec)
 {
   /* Notes:
-   *   * assumes we're between the 1st and 2nd week rollover
-   *     (i.e. between 22 Aug 1999 and 7 April 2019), so this
-   *     should be taken care of before the next rollover...
+   *   * week rollover period can be specified using option
+   *     gps-week-rollover, otherwise input timestamps are
+   *     assumed to be within previous 1024 weeks from today
    *   * list of leap seconds taken from
    *     <http://maia.usno.navy.mil/ser7/tai-utc.dat>
-   *     as of 2012-10-12. Please update when necessary.
+   *     as of 2019-01-19. Please update when necessary.
    *     Announcement of leap seconds:
    *     <http://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat>
    *   * leap seconds of 1999 JAN  1 and before are not reflected
@@ -594,7 +603,13 @@ gpstime_to_timet(int week, int sec)
    *     (i.e. sec >= 7*24*3600 = 604800 is allowed)
    */
   time_t gps_timet = 315964800;     /* Jan 06 1980 0:00 UTC */
-  gps_timet += (week+1024)*7*SECONDS_PER_DAY + sec;
+
+  int week_rollover = atoi(opt_gps_week_rollover);
+  if (week_rollover < 0) {
+    int current_week = (time(NULL)-gps_timet)/(7*SECONDS_PER_DAY);
+    week_rollover = current_week/1024 - (week > current_week%1024 ? 1 : 0);
+  }
+  gps_timet += (week+week_rollover*1024)*7*SECONDS_PER_DAY + sec;
 
   int override = atoi(opt_gps_utc_offset);
   if (override) {
index 0966ca4cebdec9a9d4bd4067ec0bcb657edc23b0..ede34d7e32320ff3495086b11139b8f99f2f8964 100644 (file)
@@ -2,21 +2,21 @@
 # Skytraq logger tests
 #
 rm -f ${TMPDIR}/skytraq.*
-gpsbabel -t -w -i skytraq-bin -f ${REFERENCE}/skytraq.bin -o gpx -F ${TMPDIR}/skytraq.gpx
+gpsbabel -t -w -i skytraq-bin,gps-week-rollover=1 -f ${REFERENCE}/skytraq.bin -o gpx -F ${TMPDIR}/skytraq.gpx
 compare ${REFERENCE}/skytraq.gpx ${TMPDIR}/skytraq.gpx
 
 #
 # The original was recorded in Germany, thus all coordinates are positive.
 # This one is in North America and triggered a sign extension bug on 64-bit
 # systems prior to revision 4176.
-gpsbabel -t -w -i skytraq-bin -f ${REFERENCE}/skytraq-2.bin -o gpx -F ${TMPDIR}/skytraq-2.gpx
+gpsbabel -t -w -i skytraq-bin,gps-week-rollover=1 -f ${REFERENCE}/skytraq-2.bin -o gpx -F ${TMPDIR}/skytraq-2.gpx
 compare ${REFERENCE}/skytraq-2.gpx ${TMPDIR}/skytraq-2.gpx
 
-gpsbabel -t -w -i skytraq-bin -f ${REFERENCE}/skytraq-realdata.bin -o gpx -F ${TMPDIR}/skytraq-realdata.gpx
+gpsbabel -t -w -i skytraq-bin,gps-week-rollover=1 -f ${REFERENCE}/skytraq-realdata.bin -o gpx -F ${TMPDIR}/skytraq-realdata.gpx
 compare ${REFERENCE}/skytraq-realdata.gpx ${TMPDIR}/skytraq-realdata.gpx
 
-gpsbabel -t -w -i skytraq-bin -f ${REFERENCE}/skytraq-artificial.bin -o gpx -F ${TMPDIR}/skytraq-artificial.gpx
+gpsbabel -t -w -i skytraq-bin,gps-week-rollover=1 -f ${REFERENCE}/skytraq-artificial.bin -o gpx -F ${TMPDIR}/skytraq-artificial.gpx
 compare ${REFERENCE}/skytraq-artificial.gpx ${TMPDIR}/skytraq-artificial.gpx
 
-gpsbabel -t -w -i skytraq-bin -f ${REFERENCE}/skytraq-miniHomer2_8.bin -o gpx -F ${TMPDIR}/skytraq-miniHomer2_8.gpx
+gpsbabel -t -w -i skytraq-bin,gps-week-rollover=1 -f ${REFERENCE}/skytraq-miniHomer2_8.bin -o gpx -F ${TMPDIR}/skytraq-miniHomer2_8.gpx
 compare ${REFERENCE}/skytraq-miniHomer2_8.gpx ${TMPDIR}/skytraq-miniHomer2_8.gpx